峰值21WQps、亿级DAU,小游戏《羊了个羊》是怎么架构的?
小游戏《羊了个羊》 短短的7天内,DAU突破了1亿、吞吐量峰值21WQps。
《羊了个羊》运营后台数据显示,在短短的7天内,这款小游戏的DAU就突破了1亿。
要知道,除了王者荣耀、原神等屈指可数的现象级手游之外,1亿DAU是这个行业的天花板,
可是,它却被一个看上去设计粗糙的小程序游戏轻松实现了。
然而,其最初技术架构仅支撑 「5000QPS并发」,7天内突破了1亿、吞吐量峰值21WQps
如何通过架构优化,让一款小程序游戏可以在短时间内实现对上亿DAU的支持?
技术架构、运维体系、以及安全防范等技术体系都存在巨大的挑战。
那么:峰值21WQps、亿级DAU,超高吞吐小游戏,是怎么架构的?
1 低吞吐、低可用的最初技术架构
《羊了个羊》最开始的技术架构,
因为技术以及时间等因素,在设计上有些简单,
如下图1所示,
玩家流量通过一个接入层 LB进入,
传输给服务层几个 POD 进行游戏逻辑处理,
再将数据进行存储,
其中,热数据存储在Redis中, 持久化数据存在MongoDB。
最初的服务层几个 POD ,都是单点服务
「单点服务的性能瓶颈,再加上代码未进行充分优化,造成当时的系统最高只能承受5000的QPS」,
但实际流量增长很快, 并且持续升高并到达性能瓶颈,游戏服务开始瘫痪,全部玩家无法再进行游戏。
2 技术架构全面升级
大部分项目,都存在低吞吐、低可用的最初技术架构
但是,如果吞吐量一上来,就面临着优化
so,
面对服务中断, 《羊了个羊》团队在详细分析原来架构的不足之后,
《羊了个羊》 做了 技术架构全面升级
具体如下图:
接入层的架构优化:
启用CDN做游戏动静态资源分离,让玩家使用的游戏资源实现就近下载,减轻网络端压力;
设计多LB入口实现入口高可用和限流,避免系统被超额流量过载;
服务层的架构优化:
优化服务层的自动扩容,应对巨量的 突发流量
具体措施上,首先通过引入腾讯云TKE Serverless 的弹性机制,实现游戏服自动纵向和横向扩展,
实现服务解藕,增加容错和熔断机制;
Cache层的架构优化:
Redis缓存热数据,分担数据库查询压力等。
存储层的架构优化:
把MongoDB转换为读写分离模式,配合代码逻辑优化实现性能提升,
引入分库实现业务分层与隔离,
优化之后,《羊了个羊》最新技术架构
经过上述一系列技术升级, 新架构经受住了一波又一波的流量峰值考验,
在高峰期DAU过亿后,游戏技术系统依旧表现稳定,
这对于一个发布才几个月的小游戏来说,在国内也很难再找到这样的例子。
3 运维体系的升级
通过技术架构的迭代以及不断激增的用户,《羊了个羊》技术团队也认识到,因为爆火太快,更需要快速补齐运维能力,才能更好的持续调整和提升游戏体验。
在运维体系这块,包括 业务日志、性能监测等。
为快速补齐运维能力,通过「业务日志诊断」程序性能,配合业务调优以减少服务器压力;
《羊了个羊》选择了开箱即用的日志服务 云服务度 CLS,
当然,有条件的团队,使用自建的 elk平台,或者基于clickhouse的高并发分布式日志监测平台,也是可以的。
CLS 对游戏接口稳定性、异常调用趋势的监控可帮助他们快速观测产品质量 ,并第一时间获取到异常panic统计分析和告警 ;
在游戏运营方面,玩家登录链路耗时/对局时间等数据亦可通过 CLS 分析、校验及处理,进而调整和提升游戏体验;同时还能满足游戏用户行为及审计对账等需求。
「CLS的云原生特性,辅助进行稳定性和程序性能调优。另外,CLS用作简单运维工具查日志、做接口调用告警」
借助CLS的SQL分析、仪表盘、监控告警能力,
可以分析出程序可优化点,解决游戏开发商在初期和爆发期对游戏稳定性和运营数据分析的难题。
除了运维数据外,
CLS还提供了数据观测功能
在游戏调整玩法、分析活动数据时,运营人员可借助CLS快速观测数据变化,并作出应对策略。
另外,还将游戏的通关数据、用户行为分析、审计对账等运营数据在CLS中存储分析。
4 安全防范领域的升级
哪里有流量,哪里就有黑产。
许多恶意BOT流量大量涌入到游戏中,导致游戏服务器 QPS、带宽快速升高,影响服务可用性等情况
由于设计之初没有充分考虑安全问题,因此引来大量不法分子通过恶意BOT抢刷游戏排行,
几乎每分每秒,都有恶意流量访问游戏接口,
并且这一部分恶意群体通过互联网、QQ群和微信群中传播恶意刷排行的脚本,
极大的破坏了游戏公平性,让本该属于游戏对抗的乐趣被恶意BOT抹杀。
而且更重要的是随着羊了个羊热度的不但攀升,许多恶意BOT流量的大量涌入,导致游戏服务器 QPS、带宽快速升高,一度影响服务可用性。
「《羊了个羊》接入腾讯云WAF进行防护,」
「一开始接入WAF的时候,相关 QPS 峰值已达 21W,」
「接入WAF之前CPU一直处于临界值水位 、网络链接打满的导致服务不可用的情况。」
通过选择负载均衡型WAF, 即可在不改动网络架构的情况下3秒完成业务接入WAF,实现在用户无感的情况下对恶意流量进行清洗及防护。
为了有效打击攻击者的恶意流量,
WAF 中 BOT 行为管理也提供了全链路、全生命周期的的恶意行为流量体系,实现快速高效的恶意流量治理。
最后在安全防范领域,通过安全方案抵抗异常流量攻击。
5 互联网应用设计的“三高”原则
通过《羊了个羊》团队在小游戏架构扩容、系统运维以及安全防范领域的实战经验,可以给大家一些参考。
面对突发流量,互联网应用在设计的过程中需要考虑以下能力:
第一是「高并发」,能够承载瞬时爆发流量,保证响应时长在可接受的范围;
其次是「高可用」,系统持续提供服务,小概率发生宕机时,过载保护将故障控制在可承受范围内,不影响核心业务;
最后是「高扩展」,服务系统应该具备水平和垂直扩展能力,在成本和可用性中实现最佳平衡点。
End
硬核面试题推荐
惊呆:Mysql 普通索引、唯一索引,底层区别竟然 这么大 !! 2023高薪必备:刨根问底 100 个 操作系统 面试题,让 大厂 面试官 震惊到 怀疑人生 !! 2023高薪必备:刨根问底 100 个 Nginx连环炮, 让 大厂 面试官 震惊到 怀疑人生 !! 2023高薪必备:K8S面试题 (史上最全 + 收藏版) 大厂面试题:HashMap有几种遍历方法?推荐使用哪种?说一下HashMap底层实现? 架构必备:10WQPS超高并发架构的10大思想 2023春招必备:Docker面试题 如何写简历:2023春招,让简历 人见人爱 的8大绝招 | 附100模板 聊聊:什么是脑裂?照此文作答,面试官献上膝盖,秒发offer 场景题:假设10W人突访,系统能不crash 吗? 2023春招必备:Dubbo面试题(上) 2023春招必备:Dubbo面试题(下) 每天100w次登陆请求, 8G 内存该如何设置JVM参数?来看看年薪100W的架构师,是怎么配置的 小伙伴问题:Java堆内存用到100%了,咋办呀?该从哪里下手排查? 核心面试题:用过分布式锁吗?你们是怎么做选型的? 核心面试题:为什么新生代要两个Survivor区? 一个不行吗? 核心面试题目:什么是索引下推?什么是 MRR 优化?怎么才能更好的为表创建索引? 核心面试题目:什么是 回表查询、索引覆盖、最左匹配原则?说说聚集索引、非聚集索引的区别? 核心面试题:说说 内存溢出 、内存泄漏 如何排查? 面试重点难题:Mysql如何实现RR级隔离时,不会幻读? 核心面试题:请说说 HashMap 的时间复杂度是多少? 核心面试题: 强引用、软引用、弱引用、虚引用?重点是 各自的 使用场景? 吊打面试官:Java中String对象的大小? 核心面试难题:Java对象为什么 不一定在堆上分配? 核心面试题:MVCC、间隙锁、Undo Log链、表级锁、行级锁、页级锁、共享锁、排它锁、记录锁等等
硬核文章推荐
2个大厂 100亿级 超大流量 红包 架构方案 在滴滴,我是如何指数级提升技术水平的? 一文搞懂:Java高手必备之 Mpsc 无锁队列 (史上最全) 一文搞懂:微服务核心组件 Nacos(史上最全) 一文搞懂:微服务核心组件 sentinel(史上最全) 一文秒懂:多级时间轮,最顶尖的Java调度算法 一文搞懂:缓存之王 Caffeine 架构、源码、原理(5W长文) 高性能组件:环形队列、 条带环形队列 Striped-RingBuffer 架构分析 一文穿透:队列之王 Disruptor 原理、架构、源码 如何优雅的使用 单例模式 ?来看看缓存之王 Caffeine 、链路之王 Skywalking 是如何做的吧!
硬核电子书
《尼恩Java面试宝典》V29版
长按二维码,点击「识别图中二维码」即可查看老架构师尼恩个人微信,发暗号 「领电子书」 给尼恩,获取最新下面的 宝贵 PDF。
最新的《尼恩Java面试宝典》(极致经典,不断升级,目前最新为V29)全网下载超100万+次,获得海量好评
尼恩Java高并发三部曲:全网下载超100万+次,获得海量好评
《Java高并发核心编程-卷1(加强版)》,不断升级
《Java高并发核心编程-卷2(加强版)》,不断升级
《Java高并发核心编程-卷3(加强版)》,不断升级
尼恩架构笔记100篇+,不断添加
100份简历模板